package com.lyy.util;

import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import io.minio.MinioClient;
import lombok.SneakyThrows;
import org.springframework.web.multipart.MultipartFile;

import java.util.UUID;

/**
 * @author Liangyaoyun
 */
public class MinioUtil {

    /** MinIO存储桶名称 */
    private static String bucketName;
    /** MinIO客户端 */
    private static MinioClient minioClient;

    static {
        try {
            String endpoint = "http://192.168.159.77:9001";
            String accessKey = "OjNnIoeSuTQTpEr7HVGB";
            String secretKey = "BIOBk91mTEqqI2SYr8RlT0JO2buwrKtMJCbzH71Y";
            // 创建MinIO客户端
            minioClient = new MinioClient(endpoint, accessKey, secretKey);
            bucketName = "lesson-bucket";
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 将文件上传到MinIO对象存储服务中，并返回最终文件的访问URL地址
     *
     * @param multipartFile 文件实例
     * @param dir           文件存储目录
     * @return 文件名
     */
    @SneakyThrows
    public static String upload(MultipartFile multipartFile, String dir) {

        // 检查文件是否存在
        if (null == multipartFile || StrUtil.isBlank(dir)) {
            throw new RuntimeException("必要参数为空");
        }

        // 若bucket不存在则抛出异常
        if (!minioClient.bucketExists(bucketName)) {
            throw new RuntimeException("Minio Bucket 不存在");
        }

        // 获取最终文件名
        String filename = multipartFile.getOriginalFilename();

        // 检查文件名是否为空
        if (ObjectUtil.isEmpty(filename)) {
            throw new RuntimeException("待上传的文件名为空");
        }

        // 生成随机文件名: 由 "UUID后10位 + 当前时间戳 + 原始文件后缀" 组成
        filename = UUID.randomUUID().toString().substring(26)
                + "-"
                + System.currentTimeMillis()
                + filename.substring(filename.lastIndexOf("."));

        // 使用putObject上传文件到指定Bucket
        minioClient.putObject(bucketName, dir + "/" + filename,
                multipartFile.getInputStream(),
                multipartFile.getContentType());

        // 返回文件名
        return filename;
    }

    /**
     * 从MinIO中删除指定文件
     *
     * @param filename 文件名
     * @param dir      文件存储目录
     */
    @SneakyThrows
    public static void delete(String filename, String dir) {
        minioClient.removeObject(bucketName, dir + "/" + filename);
    }
}
